﻿/*-------------------------------------------------------------------------
* 命名空间: ScreenCapture.Common/SystemInfo
* 类       名: SystemInfo
* 功      能:  系统信息
* 时      间:  2023/12/5 10:31:27
* 版      本:  V1.0
* 作      者:  Fioman
* 格      言:  Talk is cheap,show me the code ^_^
*-------------------------------------------------------------------------*/
using ScreenCapture.ViewModels;
using System;
using System.Management;
using System.Text;

namespace ScreenCapture.Common
{
    public static class SystemInfo
    {
        public static string GetInfo()
        {
            var sb = new StringBuilder();

            sb.AppendLine($"{nameof(ScreenCapture)} v{AboutViewModel.Version}");
            sb.AppendLine(OsInfo());
            sb.AppendLine($"{(Environment.Is64BitOperatingSystem ? 64 : 32)}-bit OS");
            sb.AppendLine($"{(Environment.Is64BitProcess ? 64 : 32)}-bit Process");
            // 返回总的逻辑处理器的数量,在多核的处理器的环境中,这个数量包括每个物理处理器的所有核心.
            // 并且每个核心支持的线程数,比如你的电脑是四核处理器,斌给钱每个核心支持两个线程,那么将返回8
            sb.AppendLine($"{Environment.ProcessorCount} processor(s)");

            sb.AppendLine("\nCpu信息如下: ");
            sb.AppendLine(CpuInfo());

            sb.AppendLine("内存信息如下: ");
            sb.AppendLine(RamInfo());

            sb.AppendLine("Gpu信息如下: ");
            sb.AppendLine(GpuInfo());

            return sb.ToString();
        }

        /// <summary>
        /// 获取操作系统的信息,后面跟着的参数表示你要获取操作系统的什么属性信息.
        /// Name: Microsoft Windows 10 专业版|C:\\WINDOWS|\\Device\\Harddisk0\\Partition3\r\n\r\n"
        /// </summary>
        /// <returns></returns>
        private static string OsInfo()
        {
            // Name: Microsoft Windows 10 专业版|C:\\WINDOWS|\\Device\\Harddisk0\\Partition3\r\n\r\n"
            var deviceInfo = DeviceInformation("Win32_OperatingSystem", new[]
            {
                "Name"
            });
            return $"OS: {deviceInfo.Split(new char[] { ':', '|' })[1].Trim()}";
        }

        /// <summary>
        /// Cpu信息,Cpu名称, 多少核,多少个逻辑处理单元
        /// </summary>
        /// <returns></returns>
        private static string CpuInfo()
        {
            return DeviceInformation("Win32_Processor", new[]
            {
                "Name",
                "NumberOfCores",
                "NumberOfLogicalProcessors"
            });
        }

        /// <summary>
        /// 获取物理内存使用信息
        /// </summary>
        /// <returns></returns>
        private static string RamInfo()
        {
            return DeviceInformation("Win32_PhysicalMemory", new[]
            {
                "Name",
                "Capacity"
            });
        }


        private static string GpuInfo()
        {
            return DeviceInformation("Win32_VideoController", new[]
            {
                "Name",
                "AdapterRAM"
            });
        }

        private static string DeviceInformation(string ClassName, string[] Properties)
        {
            /*
             * ManagementClass(ClassName).GetInstance()表示获取特定类的所有实例,就是创建一个ManagementClass
             * 对象,这个对象代表了WMI中的一个特性类,比如传入的是Win32_NetworkAdapter或者的就是网络适配器的信息.
             * 如果传入的是Win32_OperatingSystem获取的就是系统信息
             */
            var sb = new StringBuilder();
            foreach (var instance in new ManagementClass(ClassName).GetInstances())
            {
                // 内层根据获取到的信息的个数再次进行遍历
                foreach (var property in Properties)
                {
                    try
                    {
                        sb.AppendLine($"{property}: {instance.Properties[property].Value}");
                    }
                    catch (System.Exception)
                    {
                        // Add codes to manage more information
                    }
                }
                sb.AppendLine();
            }
            return sb.ToString();
        }
    }

}
